import bcrypt from 'bcrypt';

/**
 * @fileoverview 密码加密与验证工具
 * @description 提供安全的密码加密和验证功能，基于bcrypt算法实现
 * @author DuYu
 * @version 1.0.0
 */

/**
 * 加密密码函数
 * @async
 * @function encryptPassword
 * @param {string} password - 需要加密的原始密码
 * @returns {Promise<string>} 加密后的密码哈希值
 * @throws {Error} 当密码为空或加密过程出错时抛出异常
 * @example
 * const hashedPassword = await encryptPassword('mySecurePassword123');
 */
export async function encryptPassword(password) {
  // 参数验证
  if (!password || typeof password !== 'string' || password.trim() === '') {
    throw new Error('密码不能为空');
  }

  // 配置盐值轮数（数值越高安全性越高但性能消耗越大）
  const saltRounds = 10;
  
  try {
    // 使用bcrypt进行密码加密
    const hashedPassword = await bcrypt.hash(password, saltRounds);
    return hashedPassword;
  } catch (error) {
    console.error('密码加密失败：', error.message);
    throw new Error('密码加密异常，请稍后重试');
  }
}

/**
 * 验证密码函数
 * @async
 * @function verifyPassword
 * @param {string} inputPassword - 用户输入的待验证密码
 * @param {string} storedHash - 存储在数据库中的密码哈希值
 * @returns {Promise<boolean>} 密码验证结果，匹配返回true，否则返回false
 * @throws {Error} 当输入参数无效或验证过程出错时抛出异常
 * @example
 * const isValid = await verifyPassword('userInputPassword', storedHash);
 */
export async function verifyPassword(inputPassword, storedHash) {
  // 参数验证
  if (!inputPassword || typeof inputPassword !== 'string' || inputPassword.trim() === '') {
    throw new Error('待验证密码不能为空');
  }
  
  if (!storedHash || typeof storedHash !== 'string' || storedHash.trim() === '') {
    throw new Error('存储的密码哈希值不能为空');
  }

  try {
    // 使用bcrypt比较密码和哈希值
    const isMatch = await bcrypt.compare(inputPassword, storedHash);
    return isMatch;
  } catch (error) {
    console.error('密码验证失败：', error.message);
    throw new Error('密码验证异常，请稍后重试');
  }
}
